package javachongkao.面向对象下.自定义接口ArrayIntegerStack;

import java.util.Arrays;
import java.util.Scanner;

//7-2 jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack
//定义IntegerStack接口，用于声明一个存放Integer元素的栈的常见方法:
//
//public Integer push(Integer item);

/// /如果item为null，则不入栈直接返回null。如果栈满，也返回null。如果插入成功，返回item。
//
//public Integer pop();   //出栈，如果为空，则返回null。出栈时只移动栈顶指针，相应位置不置为null
//public Integer peek();  //获得栈顶元素，如果为空，则返回null.
//public boolean empty(); //如果为空返回true
//public int size();      //返回栈中元素个数
//定义IntegerStack的实现类ArrayIntegerStack，内部使用数组实现。创建时，可指定内部数组大小。
//
//main方法说明
//输入n，建立可包含n个元素的ArrayIntegerStack对象
//输入m个值，均入栈。每次入栈均打印入栈返回结果。
//输出栈顶元素，输出是否为空，输出size
//使用Arrays.toString()输出内部数组中的值。
//输入x，然后出栈x次，每次出栈均打印。
//输出栈顶元素，输出是否为空，输出size
//使用Arrays.toString()输出内部数组中的值。
//思考
//如果IntegerStack接口的实现类内部使用ArrayList来存储元素，怎么实现？测试代码需要进行什么修改？
interface IntegerStack {
    Integer push(Integer item);
    Integer pop();
    Integer peek();
    boolean empty();
    int size();
}

class ArrayIntegerStack implements IntegerStack {
    private Integer[] stackArray;
    private int top;
    private int capacity;

    public ArrayIntegerStack(int capacity) {
        this.capacity = capacity;
        this.stackArray = new Integer[capacity];
        this.top = -1;
    }

    @Override
    public Integer push(Integer item) {
        if (item == null || top == capacity - 1) {
            return null;
        }
        stackArray[++top] = item;
        return item;
    }

    @Override
    public Integer pop() {
        if (empty()) {
            return null;
        }
        return stackArray[top--];
    }

    @Override
    public Integer peek() {
        if (empty()) {
            return null;
        }
        return stackArray[top];
    }

    @Override
    public boolean empty() {
        return top == -1;
    }

    @Override
    public int size() {
        return top + 1;
    }

    public Integer[] getStackArray() {
        return stackArray;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 输入n，建立可包含n个元素的ArrayIntegerStack对象
        int n = scanner.nextInt();
        ArrayIntegerStack stack = new ArrayIntegerStack(n);

        // 输入m个值，均入栈
        int m = scanner.nextInt();
        for (int i = 0; i < m; i++) {
            Integer item = scanner.nextInt();
            System.out.println(stack.push(item));
        }

        // 输出栈顶元素，输出是否为空，输出size
        System.out.println(stack.peek() + "," + stack.empty() + "," + stack.size());

        // 输出内部数组中的值
        System.out.println(Arrays.toString(stack.getStackArray()));

        // 输入x，然后出栈x次
        int x = scanner.nextInt();
        for (int i = 0; i < x; i++) {
            System.out.println(stack.pop());
        }

        // 再次输出栈顶元素，输出是否为空，输出size
        System.out.println(stack.peek() + "," + stack.empty() + "," + stack.size());

        // 再次输出内部数组中的值
        System.out.println(Arrays.toString(stack.getStackArray()));

        scanner.close();
    }
}
